From 9412bd75a049b4ff4999131fd4444b3c08af7365 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Mon, 25 Jul 2005 21:02:09 +0000 Subject: [PATCH] Implement the I/O bitmap vm execution control. With this patch, we should not bee seeing any vmexits for debug port accesses. Signed-off-by: Edwin Zhai Signed-off-by: Arun Sharma --- xen/arch/x86/domain.c | 16 ++++++++++++++++ xen/arch/x86/vmx.c | 5 ----- xen/arch/x86/vmx_vmcs.c | 20 ++++++++++++++++++-- xen/include/asm-x86/vmx.h | 1 + xen/include/asm-x86/vmx_vmcs.h | 3 +++ 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index d28e5683f7..712a8888f5 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -373,6 +373,14 @@ static int vmx_final_setup_guest( out: free_vmcs(vmcs); + if(v->arch.arch_vmx.io_bitmap_a != 0) { + free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000)); + v->arch.arch_vmx.io_bitmap_a = 0; + } + if(v->arch.arch_vmx.io_bitmap_b != 0) { + free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000)); + v->arch.arch_vmx.io_bitmap_b = 0; + } v->arch.arch_vmx.vmcs = 0; return error; } @@ -926,6 +934,14 @@ static void vmx_relinquish_resources(struct vcpu *v) BUG_ON(v->arch.arch_vmx.vmcs == NULL); free_vmcs(v->arch.arch_vmx.vmcs); + if(v->arch.arch_vmx.io_bitmap_a != 0) { + free_xenheap_pages(v->arch.arch_vmx.io_bitmap_a, get_order(0x1000)); + v->arch.arch_vmx.io_bitmap_a = 0; + } + if(v->arch.arch_vmx.io_bitmap_b != 0) { + free_xenheap_pages(v->arch.arch_vmx.io_bitmap_b, get_order(0x1000)); + v->arch.arch_vmx.io_bitmap_b = 0; + } v->arch.arch_vmx.vmcs = 0; free_monitor_pagetable(v); diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index 17c6d559bc..714049ae11 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -609,11 +609,6 @@ static void vmx_io_instruction(struct cpu_user_regs *regs, else addr = regs->edx & 0xffff; - if (addr == 0x80) { - __update_guest_eip(inst_len); - return; - } - vio = get_vio(d->domain, d->vcpu_id); if (vio == 0) { printk("bad shared page: %lx", (unsigned long) vio); diff --git a/xen/arch/x86/vmx_vmcs.c b/xen/arch/x86/vmx_vmcs.c index b7277e08c9..c4bb82437c 100644 --- a/xen/arch/x86/vmx_vmcs.c +++ b/xen/arch/x86/vmx_vmcs.c @@ -59,9 +59,11 @@ void free_vmcs(struct vmcs_struct *vmcs) free_xenheap_pages(vmcs, order); } -static inline int construct_vmcs_controls(void) +static inline int construct_vmcs_controls(struct arch_vmx_struct *arch_vmx) { int error = 0; + void *io_bitmap_a; + void *io_bitmap_b; error |= __vmwrite(PIN_BASED_VM_EXEC_CONTROL, MONITOR_PIN_BASED_EXEC_CONTROLS); @@ -73,6 +75,20 @@ static inline int construct_vmcs_controls(void) error |= __vmwrite(VM_ENTRY_CONTROLS, MONITOR_VM_ENTRY_CONTROLS); + /* need to use 0x1000 instead of PAGE_SIZE */ + io_bitmap_a = (void*) alloc_xenheap_pages(get_order(0x1000)); + io_bitmap_b = (void*) alloc_xenheap_pages(get_order(0x1000)); + memset(io_bitmap_a, 0xff, 0x1000); + /* don't bother debug port access */ + clear_bit(PC_DEBUG_PORT, io_bitmap_a); + memset(io_bitmap_b, 0xff, 0x1000); + + error |= __vmwrite(IO_BITMAP_A, (u64) virt_to_phys(io_bitmap_a)); + error |= __vmwrite(IO_BITMAP_B, (u64) virt_to_phys(io_bitmap_b)); + + arch_vmx->io_bitmap_a = io_bitmap_a; + arch_vmx->io_bitmap_b = io_bitmap_b; + return error; } @@ -432,7 +448,7 @@ int construct_vmcs(struct arch_vmx_struct *arch_vmx, (unsigned long) vmcs_phys_ptr); return -EINVAL; } - if ((error = construct_vmcs_controls())) { + if ((error = construct_vmcs_controls(arch_vmx))) { printk("construct_vmcs: construct_vmcs_controls failed\n"); return -EINVAL; } diff --git a/xen/include/asm-x86/vmx.h b/xen/include/asm-x86/vmx.h index 36ef003de8..5596549ce1 100644 --- a/xen/include/asm-x86/vmx.h +++ b/xen/include/asm-x86/vmx.h @@ -61,6 +61,7 @@ extern unsigned int cpu_rev; CPU_BASED_INVDPG_EXITING | \ CPU_BASED_MWAIT_EXITING | \ CPU_BASED_MOV_DR_EXITING | \ + CPU_BASED_ACTIVATE_IO_BITMAP | \ CPU_BASED_UNCOND_IO_EXITING \ ) diff --git a/xen/include/asm-x86/vmx_vmcs.h b/xen/include/asm-x86/vmx_vmcs.h index 93cdb48127..68db612665 100644 --- a/xen/include/asm-x86/vmx_vmcs.h +++ b/xen/include/asm-x86/vmx_vmcs.h @@ -69,6 +69,8 @@ struct msr_state{ unsigned long shadow_gs; }; +#define PC_DEBUG_PORT 0x80 + struct arch_vmx_struct { struct vmcs_struct *vmcs; /* VMCS pointer in virtual */ unsigned long flags; /* VMCS flags */ @@ -76,6 +78,7 @@ struct arch_vmx_struct { unsigned long cpu_cr3; unsigned long cpu_state; struct msr_state msr_content; + void *io_bitmap_a, *io_bitmap_b; }; #define vmx_schedule_tail(next) \ -- 2.30.2